/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pl.butler.cezary.syncTool.storage.metadata;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import pl.butler.cezary.syncTool.scanning.ChangeStatus;
import pl.butler.cezary.syncTool.storage.CheckSumUtils;

/**
 *
 * @author Czarek
 */
public class SerializedMetadataStorage extends MetadataStorage{
    
    private static final Logger log = Logger.getLogger(SerializedMetadataStorage.class.getName());
    private final File storageFile;
    private final CheckSumUtils checksum = new CheckSumUtils();
    protected Map<String, FileMetadata> metadataMap = new HashMap<String, FileMetadata>();

    public SerializedMetadataStorage(File storageFile) {
        this.storageFile = storageFile;
    }

    public FileMetadata getFileMetadata(File plik) {
        return metadataMap.get(plik.getPath());
    }

    public void load() {
        try {
            FileInputStream input = new FileInputStream(storageFile);
            ObjectInputStream objInput = new ObjectInputStream(input);
            try{
                metadataMap = (Map<String, FileMetadata>)objInput.readObject();
            }finally{
                objInput.close();
                input.close();
            }
        } catch (Exception e) {
            log.log(Level.SEVERE, "Błąd wczytywania pliku metadanych magazynu.",e);
        } 
    }

    public void registerChange(File plik, ChangeStatus status) {
        final String path = plik.getPath();
        //TODO sprawdzenie zgodności ze statusem np w asercjach
        //TODO możliwe że warto przenieść większość logiki do nadklasy
        final FileMetadata meta = metadataMap.get(path);
        
        if(meta==null){
            final FileVersionMetadata verMeta = new FileVersionMetadata(plik, checksum.calclulateChecksum(plik));
            metadataMap.put(path, new FileMetadata(verMeta, plik));
        }else{//TODO obsługa tego że plik niekoniecznie musi być nowszy!!!
            meta.updateCurrentVersion(new FileVersionMetadata(plik, meta.getCurrentVersion(), checksum.calclulateChecksum(plik)));
        }
        
    }

    public void save() {
        try {
            FileOutputStream output = new FileOutputStream(storageFile);
            ObjectOutputStream objOutput = new ObjectOutputStream(output);
            try {
                objOutput.writeObject(metadataMap);
                log.info("Zapisano dane do magazynu");
            } finally {
                objOutput.close();
                output.close();
            }
        } catch (Exception e) {
            log.log(Level.SEVERE, String.format("Błąd podczas próby zapisania danych."), e);
        }
    }
    
    
    
}
